#include "IEffectProperty.h"
#include "IEffect.h"

#include <Rz/Graphics/Math/Vector2.h>
#include <Rz/Graphics/Math/Vector3.h>
#include <Rz/Graphics/Math/Vector4.h>
#include <Rz/Graphics/Math/Matrix3.h>
#include <Rz/Graphics/Math/Matrix4.h>

namespace Rz { namespace Graphics { namespace Render {

void IEffectProperty::Apply()
{
	if (_setCallback != nullptr)
	{
		_setCallback();
	}
} 

void IEffectProperty::Set(bool value)				
{ 
	_setCallback = std::bind(&IEffectProperty::SetBool, this, value);
}

void IEffectProperty::Set(s32 value)				
{ 
	_setCallback = std::bind(&IEffectProperty::SetInt32, this, value);
}

void IEffectProperty::Set(f32 value)				
{ 
	_setCallback = std::bind(&IEffectProperty::SetFloat, this, value);
}

void IEffectProperty::Set(const Math::Vector2& value)
{
	_setCallback = std::bind(&IEffectProperty::SetVector2, this, value); 
}

void IEffectProperty::Set(const Math::Vector3& value)
{
	_setCallback = std::bind(&IEffectProperty::SetVector3, this, value); 
}

void IEffectProperty::Set(const Math::Vector4& value)	
{
	_setCallback = std::bind(&IEffectProperty::SetVector4, this, value);
}

void IEffectProperty::Set(const Math::Matrix3& value)	
{
	_setCallback = std::bind(&IEffectProperty::SetMatrix3, this, value);
}

void IEffectProperty::Set(const Math::Matrix4& value)
{
	_setCallback = std::bind(&IEffectProperty::SetMatrix4, this, value); 
}

void IEffectProperty::Set(const ITexture2D* value)	
{ 
	_setCallback = std::bind(&IEffectProperty::SetTexture2D, this, value); 
}

void IEffectProperty::operator = (bool value)			
{
	Set(value);
}

void IEffectProperty::operator = (s32 value)		
{
	Set(value);
}

void IEffectProperty::operator = (f32 value)			
{ 
	Set(value);
}

void IEffectProperty::operator = (const Math::Vector2& value)
{ 
	Set(value); 
}

void IEffectProperty::operator = (const Math::Vector3& value)
{
	Set(value);
}

void IEffectProperty::operator = (const Math::Vector4& value)
{
	Set(value);
}

void IEffectProperty::operator = (const Math::Matrix3& value)
{ 
	Set(value); 
}

void IEffectProperty::operator = (const Math::Matrix4& value)
{
	Set(value);
}

void IEffectProperty::operator = (const ITexture2D* value)
{ 
	Set(value); 
}

const IEffect* IEffectProperty::GetEffect() const
{
	return _effect; 
}

IEffect* IEffectProperty::GetEffect() 
{
	return _effect;
}

const String& IEffectProperty::GetPropertyName() const
{
	return _propertyName;
}

String& IEffectProperty::GetPropertyName() 
{ 
	return _propertyName;
}

void IEffectProperty::SetPropertyName(const String& propertyName) 
{
	_propertyName = propertyName; 
}

void IEffectProperty::SetEffect(IEffect* effect)
{ 
	_effect = effect;
}

} } }
